<html>
    <head>
        <title>解决方案结构</title>
    </head>
    <body>
        <script>
            // 分层解决方案：结构
                    /*
                            (本文档中提到的某些功能在免费版本中可能不可用。我们使用*符号来指示在Team和更高许可证中可用的功能。)

                            本文档解释了ABP Studio的分层解决方案模板的解决方案和文件夹结构。
                    */

                    /*
                        一、解决方案根目录文件夹结构

                                解决方案的根文件夹将类似于以下内容：

                                        ①、.abpstudio文件夹存储您对此解决方案的个人偏好，并被排除在源代码控制之外（Git被忽略）。它由ABP Studio创建和使用

                                        ②、etc文件夹包含解决方案的其他文件，组织到以下子文件夹中：

                                                    ★、abp-studio文件夹包含由ABP Studio管理的设置。此文件夹包含在源代码控制中并在开发人员之间共享。

                                                    ★、docker文件夹提供docker-compose配置以在本地机器上轻松运行解决方案的基础架构依赖项（例如RabbitMQ、Redis）。

                                                    ★、helm文件夹包含Helm图表和相关脚本，用于将解决方案部署到库伯内特斯。*

                                        ③、src文件夹包含解决方案的源代码，根据DDD原则构建。它还包括数据库迁移，并且根据您的项目创建选项，可能包括移动和Web应用程序项目。

                                        ④、test文件夹包含解决方案的单元和集成测试。


                    */

                    /*
                        二、理解分层解决方案结构

                                1、Domaim.Shared 项目

                                            该项目包含常量、枚举和其他对象，这些对象实际上是域层的一部分，但需要被解决方案中的所有层/项目使用。

                                            BookType枚举和BookConsts类（可能有一些常量字段用于Book实体，如MaxNameLength）是该项目的良好候选者。

                                            ★、该项目不依赖于解决方案中的其他项目。所有其他项目都直接或间接地依赖于这个项目。

                                2、Domain 项目

                                            这是解决方案的领域层。
                                            
                                            它主要包含 "实体"、"聚合根"、"领域服务"、"值对象"、"存储库接口"  和其他域对象。

                                            ★、本项目依赖于 Domain.Shared 项目。

                                                    因为它需要使用 Domain.Shared 项目中的常量、枚举和其他对象。

                                3、Application.Contracts 项目

                                            本项目主要包含应用层的 "应用服务接口" 和 "数据传输对象（DTO）"。
                                            
                                            它的存在是为了分离应用层的接口和实现。
                                            
                                            这样，接口项目可以作为合同包共享给客户端。

                                            ★、本项目依赖于 Domain.Shared 项目。

                                                    因为它需要使用 Domain.Shared 项目中的常量、枚举和其他对象。

                                4、Application  项目

                                            ★、依赖于.Application.Contracts项目，需要 实现服务接口 和 使用Dto
                                            
                                            ★、依赖于.Domain项目，使用领域对象（实体、存储库接口…等）来实现应用服务逻辑。


                                5、EntityFrameworkCore 项目
                                
                                            这是EF Core的集成项目。它定义了DbContext并实现了.Domain项目。

                                            ★、依赖于.Domain项目，需要引用 "实体" 和 "存储库接口"。


                                6、DbMigrator项目

                                            这是一个控制台应用程序，可简化在开发和生产环境中执行数据库迁移。
                                            
                                            当您运行此应用程序时，它会：

                                                    ①、如有必要，创建数据库。

                                                    ②、应用即将发生的、迫近的的数据库迁移

                                                    ③、如果需要，播种初始数据。

                                            ★、这个项目有自己的appsettings.json文件。因此，如果要更改数据库连接字符串，请记住也更改此文件。、

                                            特别是，播种初始数据在这一点上很重要。
                                            
                                            ABP有一个模块化的数据种子基础设施。有关数据播种的更多信息，请参阅其留档。

                                            （虽然创建数据库和应用迁移似乎只需要关系数据库，但即使您选择了非关系型数据库提供程序（如MongoDB），该项目也会出现。在这种情况下，它仍然播种应用程序所需的初始数据。）

                                            ★、依赖于.EntityFrameworkCore项目（用于EF Core），因为它需要访问迁移。

                                            ★、依赖于.Application.Contracts项目，因为需要访问权限定义，因为初始数据播种器默认将所有权限授予管理员角色。



                                6、HttpApi 项目

                                            该项目用于定义您的API控制器。

                                            多数时候，您不需要手动定义API控制器，因为ABP的Auto API Controller功能会根据您的应用层自动创建它们。

                                            但是，如果您需要编写API控制器，这是最好的地方。
                               

                                            ★、依赖于.Application.Contracts项目能够注入应用程序服务接口。

                                                            因为要调用服务接口和使用DTO来创建控制器。

                                7、HttpApi.Client项目

                                            这是一个定义C#客户端代理以使用解决方案的HTTP API的项目。

                                            您可以将此库共享给第3方客户端，以便他们可以在其Dotnet应用程序中轻松使用您的HTTP API
                                            
                                            （对于其他类型的应用程序，他们仍然可以手动或使用自己平台中的工具）

                                            大多数时候，您不需要手动创建C#客户端代理，这要归功于ABP的Dynamic C#API Clients功能。

                                            ★、依赖于 Application.Contracts项目能够与远程服务共享相同的应用程序服务接口和DTO。


                                8、Web 项目

                                           如果您使用ASP.NETCore MVC UI，此项目包含应用程序的用户界面（UI）。它包含Razor页面、JavaScript文件、CSS文件、图像等…

                                           该项目包含主appsettings.json文件，其中包含连接字符串和应用程序的其他配置。

                                           ★、依赖于.HttpApi项目，因为UI层需要使用API和解决方案的应用程序服务接口。

                                                （  
                                                        如果您检查.Web.csproj文件，您将看到对.Application和.EntityFrameworkCore项目。
                                                    
                                                        在编写UI层时实际上不需要这些引用，因为UI层通常不依赖于EF Core或应用层的实现。
                                                        
                                                        这些启动模板已准备好进行分层部署，其中API层托管在与UI层不同的单独服务器上。

                                                        但是，如果您不选择--tiered选项，这些引用将在. Web项目能够在单个应用程序端点中托管Web、API和应用程序层。
                                                        
                                                        这使您能够在表示层中使用域实体和存储库。但是，根据DDD，这被认为是一种不好的做法
                                                  ）


                                 9、怎么运行解决方案？


                                           您可以打开Solution Runner面板并启动所有应用程序。默认用户名为admin，密码为 1q2w3E*。
                    */

                    /*
                        三、前后端分离结构  Tiered Structure 

                                    如果选择了ASP.NETCore UI并指定了--tiered选项，则创建的解决方案将是"前后端分离"，
                                    
                                    前后端结构的目的是能够将Web应用程序和HTTP API部署到不同的服务器：

                                                ①、浏览器通过执行超文本标记语言、CSS和JavaScript来运行您的UI。

                                                ②、Web服务器托管静态UI文件（CSS、JavaScript、图像…等）和动态组件（例如Razor页面）。它执行对API服务器的HTTP请求以执行应用程序的业务逻辑。

                                                ③、API服务器托管HTTP API，然后使用应用程序的应用程序和域层来执行业务逻辑。

                                                ④、最后，数据库服务器托管您的数据库。

                                    ★、除非您真的需要这样的4层部署，否则建议使用更易于开发、部署和维护的默认结构。




                                    前后端分离部署结构如下：

                                                1、AuthServer 项目

                                                        此项目用作其他项目的身份验证服务器。

                                                        .Web项目使用OpenId Connect Authentication从AuthServer获取当前用户的身份和访问令牌。

                                                        然后使用访问令牌调用HTTP API服务器。

                                                        HTTP API服务器使用不记名令牌身份验证从访问令牌获取声明以授权当前用户。

                                                        ABP使用OpenIddicModule，该模块使用开源OpenIddic-core库进行应用程序之间的身份验证。
                                                        
                                                        有关OpenIddic和OpenID Connect协议的详细信息，请参阅OpenIddic留档。

                                                        ★、它有自己的appsettings.json，其中包含数据库连接和其他配置。


                                                2、HttpApi.Host项目

                                                        该项目是托管解决方案API的应用程序。它有自己的appsettings.json，其中包含数据库连接和其他配置。


                                                3、Web项目

                                                        就像默认结构一样，这个项目包含应用程序的用户界面（UI）。它包含Razor页面、JavaScript文件、样式文件、图像等…

                                                        这个项目包含一个appsettings.json文件，但这次它没有连接字符串，因为它从不连接到数据库。

                                                        相反，它主要访问远程API服务器和身份验证服务器的端点。

                    */
        </script>
    </body>
</html>